import { commonProps } from '../../libs/config';

const chatProps = {
	// 使用聊天记录模式，默认为否
	useChatRecordMode: {
		type: Boolean,
		default: null
	},
	// 使用聊天记录模式时滚动到顶部后，列表垂直移动偏移距离。默认0rpx。单位px（暂时无效）
	chatRecordMoreOffset: {
		type: [Number, String]
	},
	// 使用聊天记录模式时是否自动隐藏键盘：在用户触摸列表时候自动隐藏键盘，默认为是
	autoHideKeyboardWhenChat: {
		type: Boolean,
		default: null
	},
	// 使用聊天记录模式中键盘弹出时是否自动调整slot="bottom"高度，默认为是
	autoAdjustPositionWhenChat: {
		type: Boolean,
		default: null
	},
	// 使用聊天记录模式中键盘弹出时占位高度偏移距离。默认0rpx。单位px
	chatAdjustPositionOffset: {
		type: [Number, String]
	},
	// 使用聊天记录模式中键盘弹出时是否自动滚动到底部，默认为否
	autoToBottomWhenChat: {
		type: Boolean,
		default: null
	},
	// 使用聊天记录模式中reload时是否显示chatLoading，默认为否
	showChatLoadingWhenReload: {
		type: Boolean,
		default: null
	},
	// 在聊天记录模式中滑动到顶部状态为默认状态时，以加载中的状态展示，默认为是。若设置为否，则默认会显示【点击加载更多】，然后才会显示loading
	chatLoadingMoreDefaultAsLoading: {
		type: Boolean,
		default: null
	},
	// 在nvue中，需要考虑数据量不满一页的情况，因为nvue中的list无法通过flex-end修改不满一页的起始位置，会导致不满一页时列表数据从底部开始，故当数据不满一屏的时候，不进行列表倒置
	isFirstPageAndNoMore: {
		type: Boolean
	}
};

const nVuewProps = {
	// #ifdef APP-NVUE
	// nvue中修改列表类型，可选值有list、waterfall和scroller，默认为list
	nvueListIs: {
		type: String
	},
	// nvue waterfall配置，仅在nvue中且nvueListIs=waterfall时有效，配置参数详情参见：https://uniapp.dcloud.io/component/waterfall
	nvueWaterfallConfig: {
		type: Object
	},
	// nvue 控制是否回弹效果，iOS不支持动态修改
	nvueBounce: {
		type: Boolean,
		default: null
	},
	// nvue中通过代码滚动到顶部/底部时，是否加快动画效果(无滚动动画时无效)，默认为否
	nvueFastScroll: {
		type: Boolean,
		default: null
	},
	// nvue中list的id
	nvueListId: {
		type: String
	},
	// nvue中refresh组件的样式
	nvueRefresherStyle: {
		type: Object
	},
	// nvue中是否按分页模式(类似竖向swiper)显示List，默认为false
	nvuePagingEnabled: {
		type: Boolean,
		default: null
	},
	// 是否隐藏nvue列表底部的tagView，此view用于标识滚动到底部位置，若隐藏则滚动到底部功能将失效，在nvue中实现吸顶+swiper功能时需将最外层scroll-view的此属性设置为true。默认为否
	hideNvueBottomTag: {
		type: Boolean
	},
	// nvue中控制onscroll事件触发的频率：表示两次onscroll事件之间列表至少滚动了10px。注意，将该值设置为较小的数值会提高滚动事件采样的精度，但同时也会降低页面的性能
	offsetAccuracy: {
		type: Number
	}

	// #endif
};

export const scrollViewProps = {
	...chatProps,
	...nVuewProps,
	// 在APP-VUE、微信小程序、QQ小程序和h5中，是否实时监听Touchmove，默认为否
	watchTouchmove: {
		type: Boolean,
		default: null
	},
	// 下拉刷新的主题颜色，默认#777777
	refresherThemeColor: {
		type: String
	},
	// 自定义下拉刷新中左侧图标的样式
	refresherImgStyle: {
		type: Object
	},
	// 自定义下拉刷新中右侧状态描述文字的样式
	refresherTitleStyle: {
		type: Object
	},
	// 自定义下拉刷新中右侧最后更新时间文字的样式(show-refresher-update-time为true时有效)
	refresherUpdateTimeStyle: {
		type: Object
	},
	// 在APP-VUE、微信小程序、QQ小程序和h5中，是否实时监听下拉刷新中进度，默认为否
	watchRefresherTouchmove: {
		type: Boolean,
		default: null
	},
	// 自定义下拉刷新默认状态下回弹动画时间，单位为毫秒，默认为100毫秒，nvue无效
	refresherDefaultDuration: {
		type: [Number, String]
	},
	// 自定义下拉刷新结束以后延迟回弹的时间，单位为毫秒，默认为0
	refresherCompleteDelay: {
		type: [Number, String]
	},
	// 自定义下拉刷新结束回弹动画时间，单位为毫秒，默认为300毫秒(refresherEndBounceEnabled为false时，refresherCompleteDuration为设定值的1/3)，nvue无效
	refresherCompleteDuration: {
		type: [Number, String]
	},
	// 自定义下拉刷新中是否允许列表滚动，默认为是
	refresherRefreshingScrollable: {
		type: Boolean,
		default: null
	},
	// 自定义下拉刷新结束状态下是否允许列表滚动，默认为否
	refresherCompleteScrollable: {
		type: Boolean,
		default: null
	},
	// 是否使用自定义的下拉刷新，默认为是，即使用组件的下拉刷新。设置为false即代表使用uni scroll-view自带的下拉刷新，h5、App、微信小程序以外的平台不支持uni scroll-view自带的下拉刷新
	useCustomRefresher: {
		type: Boolean,
		default: null
	},
	// 自定义下拉刷新下拉帧率，默认为40，过高可能会出现抖动问题
	refresherFps: {
		type: [Number, String]
	},
	// 自定义下拉刷新允许触发的最大下拉角度，默认为40度，当下拉角度小于设定值时，自定义下拉刷新动画不会被触发
	refresherMaxAngle: {
		type: [Number, String]
	},
	// 自定义下拉刷新的角度由未达到最大角度变到达到最大角度时，是否继续下拉刷新手势，默认为否
	refresherAngleEnableChangeContinued: {
		type: Boolean,
		default: null
	},
	// 自定义下拉刷新默认状态下的文字
	refresherDefaultText: {
		type:String
	},
	// 自定义下拉刷新松手立即刷新状态下的文字
	refresherPullingText: {
		type:String
	},
	// 自定义下拉刷新刷新中状态下的文字
	refresherRefreshingText: {
		type:String
	},
	// 自定义下拉刷新刷新结束状态下的文字
	refresherCompleteText: {
		type:String
	},
	// 自定义继续下拉进入二楼文字
	refresherGoF2Text: {
		type: String
	},
	// 自定义下拉刷新默认状态下的图片
	refresherDefaultImg: {
		type: String
	},
	// 自定义下拉刷新松手立即刷新状态下的图片，默认与refresherDefaultImg一致
	refresherPullingImg: {
		type: String
	},
	// 自定义下拉刷新刷新中状态下的图片
	refresherRefreshingImg: {
		type: String
	},
	// 自定义下拉刷新刷新结束状态下的图片
	refresherCompleteImg: {
		type: String
	},
	// 自定义下拉刷新刷新中状态下是否展示旋转动画
	refresherRefreshingAnimated: {
		type: Boolean,
		default: null
	},
	// 是否开启自定义下拉刷新刷新结束回弹效果，默认为是
	refresherEndBounceEnabled: {
		type: Boolean,
		default: null
	},
	// 是否开启自定义下拉刷新，默认为是
	refresherEnabled: {
		type: Boolean,
		default: null
	},
	// 设置自定义下拉刷新阈值，默认为80rpx
	refresherThreshold: {
		type: [Number, String]
	},
	// 设置系统下拉刷新默认样式,默认为#777777
	refresherDefaultColor: {
		type: String
	},
	// 设置自定义下拉刷新区域背景
	refresherBackground: {
		type: String
	},
	// 设置固定的自定义下拉刷新区域背景
	refresherFixedBackground: {
		type: String
	},
	// 设置固定的自定义下拉刷新区域高度，默认为0
	refresherFixedBacHeight: {
		type: [Number, String]
	},
	// 设置自定义下拉刷新下拉超出阈值后继续下拉位移衰减的比例，范围0-1，值越大代表衰减越多。默认为0.65(nvue无效)
	refresherOutRate: {
		type: Number
	},
	// 是否开启下拉进入二楼功能，默认为否
	refresherF2Enabled: {
		type: Boolean,
		default: null
	},
	// 下拉进入二楼阈值，默认为200rpx
	refresherF2Threshold: {
		type: [Number, String]
	},
	// 下拉进入二楼动画时间，单位为毫秒，默认为200毫秒
	refresherF2Duration: {
		type: [Number, String]
	},
	// 下拉进入二楼状态松手后是否弹出二楼，默认为是
	showRefresherF2: {
		type: Boolean,
		default: null
	},
	// 设置自定义下拉刷新下拉时实际下拉位移与用户下拉距离的比值，默认为0.75，即代表若用户下拉10px，则实际位移为7.5px(nvue无效)
	refresherPullRate: {
		type: Number
	},
	// 最后更新时间文本
	refresherTimeText: {
		type: String
	},
	// 下拉刷新时下拉到“松手立即刷新”或“松手进入二楼”状态时是否使手机短振动，默认为否（h5无效）
	refresherVibrate: {
		type: Boolean,
		default: null
	},
	// 下拉刷新时是否禁止下拉刷新view跟随用户触摸竖直移动，默认为否。注意此属性只是禁止下拉刷新view移动，其他下拉刷新逻辑依然会正常触发
	refresherNoTransform: {
		type: Boolean,
		default: null
	},
	// 是否开启下拉刷新状态栏占位，适用于隐藏导航栏时，下拉刷新需要避开状态栏高度的情况，默认为否
	useRefresherStatusBarPlaceholder: {
		type: Boolean,
		default: null
	},
	// 距底部/右边多远时（单位px），触发 scrolltolower 事件，默认为100rpx
	lowerThreshold: {
		type: [Number, String]
	},

	// 使用页面滚动，默认为否，当设置为是时则使用页面的滚动而非此组件内部的scroll-view的滚动，使用页面滚动时scroll-view无需设置确定的高度且对于长列表展示性能更高，但配置会略微繁琐
	usePageScroll: {
		type: Boolean,
		default: null
	},
	// 是否可以滚动，使用内置scroll-view和nvue时有效，默认为是
	scrollable: {
		type: Boolean,
		default: null
	},
	// 控制是否出现滚动条，默认为是
	showScrollbar: {
		type: Boolean,
		default: null
	},
	// 是否允许横向滚动，默认为否
	scrollX: {
		type: Boolean,
		default: null
	},
	// iOS设备上滚动到顶部时是否允许回弹效果，默认为否。关闭回弹效果后可使滚动到顶部与下拉刷新更连贯，但是有吸顶view时滚动到顶部时可能出现抖动。
	scrollToTopBounceEnabled: {
		type: Boolean,
		default: null
	},
	// iOS设备上滚动到底部时是否允许回弹效果，默认为是。
	scrollToBottomBounceEnabled: {
		type: Boolean,
		default: null
	},
	// 在设置滚动条位置时使用动画过渡，默认为否
	scrollWithAnimation: {
		type: Boolean,
		default: null
	},
	// 值应为某子元素id（id不能以数字开头）。设置哪个方向可滚动，则在哪个方向滚动到该元素
	scrollIntoView: {
		type: String
	},
	// 点击返回顶部按钮返回到顶部时是否展示过渡动画，默认为是
	backToTopWithAnimate: {
		type: Boolean,
		default: null
	},
	// nvue中通过代码滚动到顶部/底部时，是否加快动画效果(无滚动动画时无效)，默认为否
	nvueFastScroll: {
		type: Boolean,
		default: null
	},
	// 调用complete后延迟处理的时间，单位为毫秒，默认0毫秒，优先级高于minDelay
	delay: {
		type: [Number, String]
	},
	// 触发@query后最小延迟处理的时间，单位为毫秒，默认0毫秒，优先级低于delay（假设设置为300毫秒，若分页请求时间小于300毫秒，则在调用complete后延迟[300毫秒-请求时长]；若请求时长大于300毫秒，则不延迟），当show-refresher-when-reload为true或reload(true)时，其最小值为400
	minDelay: {
		type: [Number, String]
	},
	// 设置scroll-view的style，部分平台(如微信小程序)无法直接修改组件的style，可使用此属性代替
	pagingStyle: {
		type: Object
	},
	// scroll-view的高度，优先级低于pagingStyle中设置的height；传字符串，如100px、100rpx、100%
	height: {
		type: String
	},
	// scroll-view的宽度，优先级低于pagingStyle中设置的width；传字符串，如100px、100rpx、100%
	width: {
		type: String
	},
	// scroll-view的最大宽度，优先级低于pagingStyle中设置的max-width；传字符串，如100px、100rpx、100%。默认为空，也就是铺满窗口宽度，若设置了特定值则会自动添加margin: 0 auto
	maxWidth: {
		type: String
	},
	// scroll-view的背景色，优先级低于pagingStyle中设置的background。传字符串，如"#ffffff"
	bgColor: {
		type: String
	},
	// 设置scroll-view的容器(插槽的父view)的style
	pagingContentStyle: {
		type: Object
	},
	// scroll-view是否自动高度，若自动高度则会自动铺满屏幕
	autoHeight: {
		type: Boolean,
		default: null
	},
	// scroll-view是否自动高度时，附加的高度，注意添加单位px或rpx，若需要减少高度，则传负数
	autoHeightAddition: {
		type: [Number, String]
	},
	// loading(下拉刷新、上拉加载更多)的主题颜色，默认#777777
	defaultThemeColor: {
		type: String
	},
	// scroll-view是否使用fixed布局，若使用fixed布局，则scroll-view的父view无需固定高度，scroll-view高度默认为100%，默认为是(当使用内置scroll-view滚动时有效)
	fixed: {
		type: Boolean,
		default: null
	},
	// 是否开启底部安全区域适配
	safeAreaInsetBottom: {
		type: Boolean,
		default: null
	},
	// 开启底部安全区域适配后，是否使用placeholder形式实现，默认为否。为否时滚动区域会自动避开底部安全区域，也就是所有滚动内容都不会挡住底部安全区域，若设置为是，则滚动时滚动内容会挡住底部安全区域，但是当滚动到底部时才会避开底部安全区域
	useSafeAreaPlaceholder: {
		type: Boolean,
		default: null
	},
	// scroll-view bottom的背景色，默认透明，传字符串，如"#ffffff"
	bottomBgColor: {
		type: String
	},
	// slot="top"的view的z-index，默认为99，仅使用页面滚动时有效
	topZIndex: {
		type: Number
	},
	// scroll-view内容容器父view的z-index，默认为1
	superContentZIndex: {
		type: Number
	},
	// scroll-view内容容器部分的z-index，默认为1
	contentZIndex: {
		type: Number
	},
	// scroll-view二楼的z-index，默认为100
	f2ZIndex: {
		type: Number
	},
	// 使用页面滚动时，是否在不满屏时自动填充满屏幕，默认为是
	autoFullHeight: {
		type: Boolean,
		default: null
	},
	// 是否监听列表触摸方向改变，默认为否
	watchTouchDirectionChange: {
		type: Boolean,
		default: null
	},
	// scroll-view中布局的单位，默认为rpx
	unit: {
		type: String
	},
	// iOS点击顶部状态栏、安卓双击标题栏时，滚动条返回顶部，只支持竖向，默认为是
	enableBackToTop: {
		type: Boolean,
		default: null
	},
	// 是否使用虚拟列表
	useVirtualList: {
		type: Boolean,
		default: null
	},
	// 虚拟列表cell高度模式，默认为fixed，也就是每个cell高度完全相同，将以第一个cell高度为准进行计算。可选值【dynamic】，即代表高度是动态非固定的，【dynamic】性能低于【fixed】。
	cellHeightMode: {
		type: String
	},
	// 预加载的列表可视范围(列表高度)页数，默认为12，即预加载当前页及上下各7页的cell。此数值越大，则虚拟列表中加载的dom越多，内存消耗越大(会维持在一个稳定值)，但增加预加载页面数量可缓解快速滚动短暂白屏问题
	preloadPage: {
		type: [Number, String]
	},
	// 固定的cell高度，cellHeightMode=fixed才有效，若设置了值，则不计算第一个cell高度而使用设置的cell高度
	fixedCellHeight: {
		type: [Number, String]
	},
	// 虚拟列表列数，默认为1。常用于每行有多列的情况，例如每行有2列数据，需要将此值设置为2
	virtualListCol: {
		type: [Number, String]
	},
	// 虚拟列表scroll取样帧率，默认为80，过低容易出现白屏问题，过高容易出现卡顿问题
	virtualScrollFps: {
		type: [Number, String]
	},
	// 强制关闭inner-list，默认为false，如果为true将强制关闭innerList，适用于开启了虚拟列表后需要强制关闭inner-list的情况
	forceCloseInnerList: {
		type: Boolean,
		default: null
	},
	// 虚拟列表的数据列表（全部数据）
	virtualListData: {
		type: Array
	},
	// 虚拟列表的实际渲染数据列表，用于双向绑定，也可通过virtualListChange事件获取（仅可见元素）
	virtualList: {
		type: Array
	},
	// 虚拟列表的数据列表单页数据长度，默认为10
	virtualListPageSize: {
		type: [Number, String]
	},
	// 虚拟列表内item的id前缀，每个元素的id都需以此开头，拼接上item的index，例如<view :id="`e-scroll-view-index-${index}`" :key="item.id" v-for="(item,index) in virtualListData" ></view>
	virtualItemIdKey:{
		type: String,
	}
};

export const scrollViewEmits = {
	refresh: () => true,
	refresherF2Change: (v:string) => true,
	scrollTopChange: (v:number) => true,
	'update:scrollTop': (v:number) => true,
	scroll: (e:any) => true,
	scrolltolower: (e:string) => true,
	scrolltoupper: () => true,
	refresherStatusChange: (v:number) => true,
	'update:refresherStatus': (v:number) => true,
	restore: () => true,
	hidedKeyboard: () => true,
	refresherTouchstart: (v:number) => true,
	refresherTouchmove: (e:any) => true,
	refresherTouchend: (v:number) => true,
	touchstart: (e:any) => true,
	touchmove: (e:any) => true,
	touchend: (e:any) => true,
	'update:virtualList': (v:any[]) => true,
	virtualListChange: (v:any[]) => true,
};
